"""
https://leetcode.cn/problems/merge-two-sorted-lists/description/


21. 合并两个有序链表
已解答
简单
相关标签
相关企业
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

 

示例 1：


输入：l1 = [1,2,4], l2 = [1,3,4]
输出：[1,1,2,3,4,4]
示例 2：

输入：l1 = [], l2 = []
输出：[]
示例 3：

输入：l1 = [], l2 = [0]
输出：[0]
 

提示：

两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列

"""

# Definition for singly-linked list.
from typing import Optional


class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    """
    巧妙利用链表节点的前置根节点特性
    """
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        parent_node=ListNode()
        temp=parent_node
        temp1=list1
        temp2=list2
        while temp1 is not None and temp2 is not None:
            if temp1.val<=temp2.val:
                temp.next=ListNode(temp1.val)
                temp=temp.next
                temp1=temp1.next
            else:
                temp.next=ListNode(temp2.val)
                temp=temp.next
                temp2=temp2.next
        if temp1 is not None:
            temp.next=temp1
        if temp2 is not None:
            temp.next=temp2
                
        return parent_node.next

if __name__=='__main__':
    s=Solution()
    l1=ListNode(1,ListNode(2,ListNode(4)))
    l2=ListNode(1,ListNode(3,ListNode(4)))
    res=s.mergeTwoLists(l1,l2)
    while res is not None:
        print(res.val)
        res=res.next

